package com.ftg.learn.chapter07.controller;

import com.ftg.learn.chapter07.entity.Demo;
import com.ftg.learn.chapter07.service.IUserService;
import com.ftg.learn.chapter07.util.ServiceUtil;
import com.ftg.learn.chapter07.vo.UserEmpVo;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;

/**
 * @author kangjx
 * @createTime 2022/11/9
 */
@RestController
public class FirstController {

    /**
     * This application has no explicit mapping for /error, so you are seeing this as a fallback.
     * <p>
     * Wed Nov 09 13:43:36 CST 2022
     * There was an unexpected error (type=Internal Server Error, status=500).
     * <p>
     * 你需要在地址描述符上面指定的id参数，但是你没有
     * Required URI template variable 'id' for method parameter type String is not present]
     * <p>
     * 需要你在地址描述符上面使用占位符
     * {参数名称}
     * 在参数里面声明当前参数绑定
     * <p>
     * GetMapping(描述符 /hello/{战位符})
     *
     * @param id123
     * @return
     * @PathVariable(参数名称)
     */
    @GetMapping(value = "/hello/{id}")
    public String hello(@PathVariable(value = "id", required = false) String id123) {
        return "hello" + id123;
    }

    /**
     * {
     * "timestamp": "2022-11-09T05:57:21.838+00:00",
     * "status": 400,
     * "error": "Bad Request",
     * "path": "/hello"
     * }
     * 1 : 传递参数不匹配
     * 1.1 个数不对
     * 1.2 类型不对
     * 2 : 值所存储的作用域不对  headers 里面取，你通过parameter传 想在请求体
     * 3 : RequestBody 与 RequestParam连用时，前端传递要用post方式，后到定义要用postmapping
     *
     * @param id
     * @param name
     * @return
     */
    @GetMapping(value = "/hello")
    public String hello1(
            //httpservletrequest.getParameter("id") ; uri?  或者  & 拼接出来的
            @RequestParam(value = "id") String id,
            // 这个代表 报文头传递 name:value
            @RequestHeader(value = "name") String name,
            //把所有类型的数据直接赋值给abc
            @RequestBody Demo abc
    ) {
        return "hello" + id + " __" + name + "-->" + abc.getName();
    }

    //    原始的servlet方式来完成传递参数
    @GetMapping("/hello1")
    public String hello2(HttpServletRequest request) {

        String name = request.getParameter("name");
        String id = request.getHeader("id");
        Enumeration<String> idname = request.getHeaderNames();
        while (idname.hasMoreElements()) {
            String temp = idname.nextElement();
            System.out.println("所有请求头传递过来的参数名称  ：" + temp);
            System.out.println("请求头参数 " + temp + " 的值为:" + request.getHeader(temp));
        }

        //与上面是否一致 可以拿到所有传递过来的 parameter 里面的名称
        //spring boot 是如何把相应的内容 赋值给参数的
//        public String hello1(
//                //httpservletrequest.getParameter("id") ; uri?  或者  & 拼接出来的
//                @RequestParam(value = "id") String id,
        //反射 : controller spring mvc - handlerAdapter -- proxy
        // proxy 可以拿到目标类以及执行方法
        //拿到方法 的时候 就可以方法 的参数

        //把参数名称 与request.getParameterNames 循环取到的变量判断 是否相同，相同的话
        //参数名称  = request.getParameter(循环的名称 );
        request.getParameterNames();

        HttpSession session = request.getSession();

        session.setAttribute("userInfo","sss");

        return name + "===>" + id;
    }

    //后台 的同步程序 同一个浏览器， 用做单体程序
//    jsp 九大对象的时候 说过 Session - httpSession 一处存储 处处可用
    @GetMapping("/hello2")
    public String hello2(HttpSession sesson) {
        String str = sesson.getAttribute("userInfo").toString();
        return str;
    }

    @Resource
    IUserService iUserService;


    @GetMapping("/demo")
    public List<Map<String,Object>> showall(){
        return iUserService.userEmpClassList();
    }

    @GetMapping("/demo1/{id}")
    public Map<String,Object> findOne(@PathVariable("id") int id){
        return iUserService.manyTableForOne(id);
    }

    @GetMapping("/demo2")
    public List<UserEmpVo> showall1(){
        return iUserService.userempList();
    }

}
